package com.fengmi.service;

import cn.hutool.json.JSONUtil;
import com.api.goods.GoodsApi;
import com.fengmi.aop.dot.DotLog;
import com.fengmi.aop.monitor.MonitorLog;
import com.fengmi.cart.entity.Cart;
import com.fengmi.goods.entity.MallGoodsSku;
import com.fengmi.interceptor.UserInfoInterceptor;
import com.fengmi.vo.ResultVO;
import org.aspectj.weaver.ast.Var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * redis
 * hash
 * key:menhu:cart
 * field:${userid}
 * value:list<cart> => json</>
 */
@Service
public class CartService implements ICartService {

    @Autowired
    private GoodsApi goodsApi;

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    @MonitorLog(time = 2)
    @DotLog(description = "用户去加入购物车",operateType = "加购")
    public ResultVO add(String skuId, Integer buyNum) {

        MallGoodsSku sku = goodsApi.findSkuById(skuId);

        if (sku == null) {
            return new ResultVO(false,"商品不纯正");
        }

        if (buyNum > sku.getSkuStock()) {
            return new ResultVO(false, "库存不足");
        }

        //获取用户的id?
        String userId = UserInfoInterceptor.getUserInfo().getUserId();
        BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps("menhu:cart");
        Object userCartListJson = operations.get(userId);

        if (StringUtils.isEmpty(userCartListJson)) {

            //加入购物车
            List<Cart> cartList = new ArrayList<>();
            Cart cart = new Cart();
            cart.setTitle(sku.getSkuTitle());
            cart.setBuyNum(buyNum);
            cart.setSpec(sku.getSkuSpec());
            cart.setMarketPrice(sku.getSkuMarketPrice().doubleValue());

            cart.setPrice(sku.getSkuPrice().doubleValue());
            cart.setSkuId(sku.getSkuId() + "");
            cart.setImg(sku.getSkuImage());

            cartList.add(cart);

            operations.put(userId, JSONUtil.toJsonStr(cartList));

            return new ResultVO(true, "加购成功");
        }

        List<Cart> carts = JSONUtil.toList((String) userCartListJson, Cart.class);

        long count = carts.stream().filter(cart -> cart.getSkuId().equals(skuId)).count();


        if (count > 0) {
            //修改buynum
            for (Cart cart : carts) {
                if (cart.getSkuId().equals(skuId)) {
                    cart.setBuyNum(cart.getBuyNum() + buyNum);
                }
            }

            operations.put(userId, JSONUtil.toJsonStr(carts));

            return new ResultVO(true, "加购成功");
        } else {
            //加入购物车
            Cart cart = new Cart();
            cart.setTitle(sku.getSkuTitle());
            cart.setBuyNum(buyNum);
            cart.setSpec(sku.getSkuSpec());
            cart.setMarketPrice(sku.getSkuMarketPrice().doubleValue());

            cart.setPrice(sku.getSkuPrice().doubleValue());
            cart.setSkuId(sku.getSkuId() + "");
            cart.setImg(sku.getSkuImage());

            carts.add(cart);
            operations.put(userId, JSONUtil.toJsonStr(carts));


            try {
                Thread.sleep(2300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


            return new ResultVO(true, "加购成功");
        }
    }

    @Override
    public List<Cart> listCart() {

        BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps("menhu:cart");
        String userId = UserInfoInterceptor.getUserInfo().getUserId();
        Object cartListJson = operations.get(userId);

        if (StringUtils.isEmpty(cartListJson)) {

            return new ArrayList<>();
        }


        return JSONUtil.toList((String) cartListJson, Cart.class);
    }

    @Override
    public ResultVO delete(String skuId) {

        //校验skuid
        BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps("menhu:cart");
        String userId = UserInfoInterceptor.getUserInfo().getUserId();
        Object cartListJson = operations.get(userId);

        if (StringUtils.isEmpty(cartListJson)) {

            return new ResultVO(false, "商品不存在");
        }


        List<Cart> carts = JSONUtil.toList((String) cartListJson, Cart.class);

        long count = carts.stream().filter(cart -> cart.getSkuId().equals(skuId)).count();
        if (count <= 0)
            return new ResultVO(false, "商品不存在");

        //怎么删除集合中的元素？
        //方式一：通过下标遍历删除[错误]
//        for (int i = 0; i < carts.size(); i++) {
//
//            if (skuId.equals(carts.get(i).getSkuId())) {
//                carts.remove(i);
//            }
//        }

        //方式二：[正确]
//        for (int i = carts.size()-1; i >=0; i--) {
//
//            if (skuId.equals(carts.get(i).getSkuId())) {
//                carts.remove(i);
//            }
//        }

        //方式三【错误】
//        for (Cart cart : carts) {  //增强的for循环底层就是迭代器
//
//            if(cart.getSkuId().equals(skuId)){
//                carts.remove(cart);
//            }
//
//
//        }

        //方式四【正确】
//        Iterator<Cart> iterator = carts.iterator();
//        while (iterator.hasNext()){
//            Cart next = iterator.next();
//            if(next.getSkuId().equals(skuId)){
//                iterator.remove();
//            }
//        }


        //方式五
        List<Cart> collect = carts.stream().filter(cart -> !cart.getSkuId().equals(skuId)).collect(Collectors.toList());

        operations.put(userId,JSONUtil.toJsonStr(collect));


        return new ResultVO(true,"删除成功");
    }

    @Override
    public ResultVO jieduan(List<Cart> carts) {

        if (carts == null) {
            return  new ResultVO(false,"非法参数");
        }


        BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps("menhu:cart");
        operations.put(UserInfoInterceptor.getUserInfo().getUserId(),JSONUtil.toJsonStr(carts));


        return new ResultVO(true,"结算成功");
    }

//
//    public static void main(String[] args) {
//        ArrayList<String> list = new ArrayList<String>();
//        list.add("a");
//        list.add("b");
//        list.add("b");
//        list.add("c");
//        list.add("c");
//
//        for (int i = 0; i < list.size(); i++) {
//            String s = list.get(i);
//            if (s.equals("b")) {
//                list.remove(s);
//            }
//        }
//
//        list.forEach(System.out::println);
//    }




//    public static void main(String[] args) {
//        ArrayList<String> list = new ArrayList<String>();
//        list.add("a");
//        list.add("b");
//        list.add("b");
//        list.add("c");
//        list.add("c");
//
//        for (int i = list.size()-1; i >= 0 ; i--) {
//
//            String s = list.get(i);
//            if (s.equals("b")) {
//                list.remove(s);
//            }
//        }
//
//        list.forEach(System.out::println);
//    }



//    public static void main(String[] args) {
//        ArrayList<String> list = new ArrayList<String>();
//        list.add("a");
//        list.add("b");
//        list.add("b");
//        list.add("c");
//        list.add("c");
//
//        for(String s:list)
//        {
//            if(s.equals("b"))
//            {
//                list.remove(s);
//            }
//        }
//
//        list.forEach( System.out::println);
//    }

//    public static void main(String[] args) {
//        ArrayList<String> list = new ArrayList<String>();
//        list.add("a");
//        list.add("b");
//        list.add("b");
//        list.add("c");
//        list.add("c");
//
//        Iterator<String> iterator = list.iterator();
//
//        while (iterator.hasNext()){
//            String next = iterator.next();
//            if("b".equals(next)){
//                iterator.remove();
//            }
//        }
//
//
//        list.forEach( System.out::println);
//    }

}